#include <iostream>
#include <memory>
#include <string>
#include "States/SharedDef.h"
#include "States/Event.h"
#include "States/Machine/UserMachine.h"
#include "States/Machine/RoomMachine.h"

int main()
{
    std::cout << "Hello World" << std::endl;

    std::shared_ptr<UserMachine> userMachine = std::make_shared<UserMachine>();
    std::shared_ptr<RoomMachine> roomMachine = std::make_shared<RoomMachine>();
    // 0 为 201, 1 为 202
    // 初始化玩家数量为0
    std::shared_ptr<Context> context[2];
    // 两间房间的状态
    std::shared_ptr<State> roomState[2];
    for(int i = 0; i < 2; i++)
    {
        context[i] = std::make_shared<Context>(0);
        roomState[i] = std::make_shared<RoomState>(Empty);
    }

    userMachine->Init();
    roomMachine->Init();

    // 预想 玩家A 空闲 + 按下进入游戏按钮 -> 玩家B 在游戏大厅
    auto nextState = userMachine->Execute(Idle, std::make_shared<UserEvent>(PressEnterGameBtn));
    // 预想 玩家B 空闲 + 按下进入游戏按钮 -> 玩家B 在游戏大厅
    auto nextState2 = userMachine->Execute(Idle, std::make_shared<UserEvent>(PressEnterGameBtn, "玩家B"));

    // 预想 玩家A 空闲 + 按下进入房间201按钮 -> 玩家A 在房间201
    nextState = userMachine->Execute(nextState->m_stateId, std::make_shared<UserEvent>(PressEnterGameRoom201Btn));
    if(nextState != NULL)
    {
        // 预想 房间201 空闲 + 按下进入房间201按钮 + context判断数据 -> 房间201 有人
        context[0]->m_userCount ++;
        roomState[0] = roomMachine->Execute(roomState[0], std::make_shared<RoomEvent>(PressEnterGameRoom201Btn), context[0]);
    }

    // 预想 玩家B空闲 + 按下进入房间201按钮 -> 玩家B 在房间201
    nextState2 = userMachine->Execute(nextState2->m_stateId, std::make_shared<UserEvent>(PressEnterGameRoom201Btn, "玩家B"));
    if(nextState2 != NULL)
    {
        // 预想 房间201 有人 + 按下进入房间201按钮 + context判断数据 -> 房间201 有人
        context[0]->m_userCount ++;
        roomState[0] = roomMachine->Execute(roomState[0], std::make_shared<RoomEvent>(PressEnterGameRoom201Btn), context[0]);
    }
    
    // 预想 玩家B 在房间201 + 按下离开房间201按钮 -> 玩家B 空闲
    nextState2 = userMachine->Execute(nextState2->m_stateId, std::make_shared<UserEvent>(PressLeaveGameRoom201Btn, "玩家B"));
    if(nextState2 != NULL)
    {
        // 预想 房间201 有人 + 按下推出房间201按钮 + context判断数据 -> 房间201 有人
        context[0]->m_userCount --;
        roomState[0] = roomMachine->Execute(roomState[0], std::make_shared<RoomEvent>(PressLeaveGameRoom201Btn), context[0]);
    }

    // 预想 玩家A 在房间201 + 按下离开房间201按钮 -> 玩家A 空闲
    nextState = userMachine->Execute(nextState->m_stateId, std::make_shared<UserEvent>(PressLeaveGameRoom201Btn));
    if(nextState != NULL)
    {
        // 预想 房间201 有人 + 按下离开房间201按钮 + context判断数据 -> 房间201 没人
        context[0]->m_userCount --;
        roomState[0] = roomMachine->Execute(roomState[0], std::make_shared<RoomEvent>(PressLeaveGameRoom201Btn), context[0]);
    }
    
    // 预想 玩家A 在房间201 + 按下退出游戏按钮 -> 未注册
    nextState = userMachine->Execute(InRoom201, std::make_shared<UserEvent>(PressLeaveGameBtn));
   
    getchar();
    return 0;
}